The software development cycle may include the following stages: define, design, develop, and deliver. In the define stage, tasks, roles and related dependencies of the execution process are modelled. The design stage is an abstraction of user and/or system activities of the process. In the design stage, the specification of software realization of the process is created. The design stage may include architectures, algorithms, and user interfaces. The design stage allows users to carry out the defined process over information technology or IT infrastructures. The define stage and the design stage may have some overlap, which means the define stage may take certain IT factors into account and the design stage can help refine the software process.
There are various possible options for process definition and software design. Tasks may be divided into smaller sub-tasks or sub-processes. Different algorithms may be used, as well as different data structures. Different user interface or UI elements may be used for the same task or sub-task (e.g., checkbox vs. radio box). A complete software design specification may be based on the choices of these options. These choices may have great impact on the general performance of the software, which includes usability, utility, and total time that users need to spend on the software to finish the process, etc.
In typical software design practices, choices as to design elements may be made by different users, based on their experience and qualitative criteria. Problems may occur when the design elements made by different users are put together. Some of these problems may not be detected until later stages. For example, the integration of tasks may create a prolonged process in which users need to be involved in a number of interactions with the software system. For example, users may get lost or make mistakes after too many pop-up windows and button clicks. Even if a user is able to finish the total process, the time may be too long and costly, drastically reducing the efficiency of the user. If these problems are found during the develop stage or after the software is delivered to customers, the cost of fixing the problems may be great. Great effort and cost may be needed to change the existing design and implementation. Sometimes systematic fixes are not possible and only workarounds may be applied. This may alleviate the problems to limited degrees; however, may make the system unnecessarily complicated. This may also lead to problems in future iterations of the software. Even if problems from poor choices of design elements are addressed at a relatively earlier stage, there may be difficulty in finding a direction to improve current software design, since these problems are usually results of multiple factors (e.g., a combination of several design elements). In other words, adjusting only one factor may not necessarily solve the problem.